/*
* Estabelecimento.java
*
* Copyright 2011 Isabella A. G. Pessoa.
* All rights reserved.
*
* This file is part of Mandatory Arrest
*
* MandatoryArrest is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MandatoryArrest is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MandatoryArrest. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Isabella Pessoa isabella.agp at gmail.com
* Michell Jacks michelljacks at gmail.com
* Monica Santana monicaasc.cc at gmail.com
*/


package br.edu.ufcg.dsc.lp2.projeto.model;

import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.EnderecoInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NomeInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NotaInvalidaException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NullParameterException;


/**
 *
 * Representa um estabelecimento com nome, endereco e o tipo de almoco
 * servido.
 * 
 */

public class Estabelecimento {

    /**
     * Cria um novo estabelecimento.
     * @param nome Nome do estabelecimento.
     * @param endereco Endereco do estabelecimento.
     * @param tipoAlmoco Tipo de almoco servido no estabelecimento.
     * @throws Excecao para nome, endereco, e tipo de almoco vazio e null.
     */
    public Estabelecimento(final String nome, final String endereco, final String tipoAlmoco) {
    	if(nome == null) { 
			throw new NomeInvalidoException("Nome nao pode ser null");
		}
		if(nome.matches("\\s*")) {
			throw new NomeInvalidoException("Nome nao pode ser vazio");
		}
    	if(endereco == null) { 
			throw new EnderecoInvalidoException("Endereco nao pode ser null");
		}
		if(endereco.matches("\\s*")) {
			throw new EnderecoInvalidoException("Endereco nao pode ser vazio");
		}
		if (tipoAlmoco == null) {
			throw new NullParameterException("Tipo de almoco nao pode ser null");
		}		
		if(tipoAlmoco.matches("\\s*")) {
			throw new NullParameterException("Tipo de almoco nao pode ser vazio");
		}
		
    	
    	this.nome = nome;
        this.endereco = endereco;
        this.popularidade = 0;
        this.tipoAlmoco = TipoDeAlmoco.valueOf(tipoAlmoco.contains("-")? 
                    tipoAlmoco.toUpperCase().replace("-", "_") : 
                    tipoAlmoco.toUpperCase().replace(" ", "_"));
    }

    /**
     * Retorna o endereco do estabelecimento.
     * @return endereco Endereco do estabelecimento.
     */
    public String getEndereco() {
        return endereco.toString() ;
    }

    /**
     * Retorna o nome do estabelecimento.
     * @return nome Nome do estabelecimento.
     */
    public String getNome() {
        return this.nome.toString();
    }

    /**
     * Retorna a popularidade de um estabelecimento.
     * @return popularidade A popularidade de um estabelecimento.
     */
    public int getPopularidade() {
        return this.popularidade;
    }
    
    /**
     * Retorna o tipo de almoco servido em um estabelecimento.
     * @return tipoAlmoco Tipo de almoco servido em um estabelecimento.
     */
    public String getTipoDeAlmoco() {
        return this.tipoAlmoco.toString();
    }

     /**
     * Atualiza a popularidade do estabelecimento.
     * @param nota Nota de um estabelecimento.
     */
    public void votar(final int nota) {
        if((nota < -5) || (nota > 5)) {
            throw new NotaInvalidaException("Nota deve estar entre -5 e 5");
        }
        this.popularidade += nota;
    }
   
    @Override
    public String toString() {
    	final String fimDeLinha = System.getProperty("line.separator");
    	return getNome() + fimDeLinha + "Endereco: " + getEndereco() + fimDeLinha + "Tipo de almoco: " + getTipoDeAlmoco();
    };

    /**
     * Nome de um estabelecimento.
     */
    private final String nome;

    /**
     * Endereco de um estabelecimento.
     */
    private final String endereco;

    /**
     * Soma de todas as notas de um estabelecimento.
     */
    private int popularidade;

    /**
     * Tipo de almoco servido em um estabelecimento.
     */
    private final TipoDeAlmoco tipoAlmoco;
}
